package cn.tiger.threadPool;

import java.util.concurrent.*;

public class CustomRejectedPolicyDemo {

    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2,                 // 核心线程数
            4,                 // 最大线程数
            60,                // 空闲线程存活时间（秒）
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(2),  // 等待队列（容量为2）
            new CustomRejectedPolicy());  // 自定义拒绝策略

        System.out.println("线程池创建完成，开始提交任务...");

        // 提交8个任务（测试各种情况）
        for (int i = 1; i <= 8; i++) {
            final int taskId = i;
            try {
                executor.execute(() -> {
                    try {
                        System.out.println(Thread.currentThread().getName() 
                            + " 正在执行任务" + taskId);
                        Thread.sleep(3000); // 模拟任务执行时间
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
            } catch (RejectedExecutionException e) {
                System.out.println("任务" + taskId + "被拒绝: " + e.getMessage());
            }
        }

        executor.shutdown();
        try {
            executor.awaitTermination(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 实现RejectedExecutionHandler接口的rejectedExecution方法 内部定义自定义拒绝策略逻辑
     */
    static class CustomRejectedPolicy implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            System.out.println("任务被拒绝，执行自定义处理策略");
            // 这里可以添加自定义处理逻辑，比如记录日志、持久化任务等
            throw new RejectedExecutionException("任务被拒绝，当前活跃线程: " 
                + executor.getActiveCount() + "，队列大小: " + executor.getQueue().size());
        }
    }
}
